/*eslint-disable*/
export function localStorageFun (global, _prefix = '') {
  const prefix = _prefix ? `${_prefix}_` : ''
  const reg = new RegExp(`^${prefix}`)
  // storage 对localstorage的封装，主要添加以下功能
  // 1、写入数据时，防止storage超出存储上限崩溃
  // 2、全局localstorage规范，必须先在storageList声明，才能使用，不能随意使用
  // storageList为整个项目的localstorage存储字段，书写规范
  // 1、如果不涵盖变量名，则必须书写存储全名，如 'subject_id'
  // 2、如果存储的名是含有变量的，则变量部分用$占位，如'question_' + examId => 'question_$'
  // 3、规范会在每次set的时候校验
  const storageList = [
    'user', // 用户设置信息
  ]
  global.storage = {
    // 与localStorage.setItem一致
    // 注意：某些数据量太大，会导致localstorage超出5M，程序崩掉，如果写入出错，则清除所有不需要长久缓存的数据
    set (key, value) {
      const canSet = validate(key)
      if (!canSet) {
        console.error( `不能设置${key}到localstorage，请先在config/storage.js中配置白名单` )
        return
      }
      try {
        localStorage.setItem(prefix + key, value)
      } catch (e) {
        this.removeCache()
        localStorage.setItem(prefix + key, value)
      }
    },
    get (key) {
      return localStorage.getItem(prefix + key)
    },
    getKeys () {
      const keys = Object.keys(localStorage)
      if (!prefix) {
        return keys
      }
      return keys.map((item) => item.replace(reg, ''))
    },
    remove (key) {
      localStorage.removeItem(prefix + key)
    },
    clear () {
      localStorage.clear()
    },
    // 返回所有的localstorage
    // 格式： [[key,value],[key1,value1]...]
    list () {
      const entries = Object.entries(localStorage)
      if (!prefix) {
        return entries
      }
      entries.forEach((item) => {
        item[0] = item[0].replace(reg, '')
      })
      return entries
    },
    // 某些情况下，需要清理掉比较耗storage的内存的字段
    removeCache () {
      const keysKeyword = []
      // 如果出问题了，清除掉所有缓存的试题数据，并重新写入
      const examStorages = Object.keys(localStorage).filter(ckey =>
        keysKeyword.some(item => ckey.includes(item))
      )
      examStorages.forEach(ckey => this.remove(ckey))
    }
  }
  /**
   * [storageList 验证某个key是否在列表里]
   * @param  {[type]} key [description]
   * @return {[type]}     [description]
   */
  function validate (key) {
    return storageList.some(item => {
      const reg = new RegExp(item.replace(/\$/g, '[a-zA-Z0-9_-]+'))
      return reg.test(key)
    })
  }
}

